UnityEditor加载AssetBundle模型变为粉色

您所在的位置:网站首页 unity 修改ab包 UnityEditor加载AssetBundle模型变为粉色

UnityEditor加载AssetBundle模型变为粉色

2024-07-17 21:55| 来源: 网络整理| 查看: 265

Unity游戏开发过程中,在UnityEditor下,我们通常直接使用游戏资产(lua代码,prefab,图片,材质等)。而游戏发布后则通常资产导出为AssetBundle以给游戏使用。

Unity会为不同的平台(android,ios,windows)生成不同的AssetBundle,如果我们在UnityEditor下面直接使用为android或者ios平台生成的AssetBundle通常会表现为粉色(shader渲染失败),其原因就是Android平台上编译好的shader(OpenGLES3、Vulkan),在Windows(Direct3D11,)下不支持。

解决方式1:Windows平台的Graphic APIs的第一个修改为OpenGLES3,并重启编辑器,重启后Shader丢失(变粉)的问题得到解决,但某些Unity版本(2021.1.24f1)的Inspector面板出现bug

操作方法如下图

 

 

解决方式2:AssetBundle加载完成后,替换其中的shader代码如下:

但是这种方式也有一些问题,变现为某些带有变体的shader的效果差异。

如我这边碰到的一个问题,本来是在透明层渲染的shader,确在不透明层渲染了,在Hierarchy面板下找到这个物体,然后再Inspector面板下展开材质的参数,回到了透明层渲染。

 

_loaderData.assetObject = _assetBundleRequest.asset; AssetUtil.Editor_ReplaceShader(_loaderData.assetObject as GameObject); [System.Diagnostics.Conditional("UNITY_EDITOR")] public static void Editor_ReplaceShader(GameObject go) { if (go == null) { return; } Renderer[] renderers = go.GetComponentsInChildren(true); foreach (var renderer in renderers) { UnityEngine.Material[] matArr = renderer.sharedMaterials; foreach (var mat in matArr) { Editor_ReplaceShader(mat, go.name); } } } [System.Diagnostics.Conditional("UNITY_EDITOR")] public static void Editor_ReplaceShader(Material mat, string gameObjectName = null) { if (mat != null && mat.shader != null) { Shader shader = Shader.Find(mat.shader.name); if (shader != null) { mat.shader = shader; } else { UnityEngine.Debug.LogError($"can't find the shader material={mat}, gameObject={gameObjectName}, shader={mat.shader.name}"); } } }

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3